package com.leadingsoft.core.config.filter;

import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.leadingsoft.common.constant.Constant;
import com.leadingsoft.core.pojo.Access;
import com.leadingsoft.core.pojo.UserInfo;
import com.leadingsoft.web.core.service.CoreService;

public class LoginInterceptor implements HandlerInterceptor {
	private final CoreService coreService;

	public LoginInterceptor(CoreService coreService) {
		this.coreService = coreService;
	}

	@Value("${is_check_login}")
	private String is_check_login;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		String uri = request.getRequestURI();
		if ("0".equals(is_check_login)) {// 证明开启了SSO，需要特别的验证过程
			// 判断是否是特定URL，以及是否有参数，以及是否有session
			// 获取到用户账号
			String account = "admin";
			// 获得用户信息
			UserInfo userInfo = coreService.getUserByAccount(account);
			// 获取session
			Object userInfo_session = request.getSession().getAttribute(Constant.SESSION_ID);
			if (null == userInfo_session) {
				request.getSession().setAttribute(Constant.SESSION_ID, userInfo);
			}
			return true;
		} else if ("1".equals(is_check_login)) {// 证明没有开启SSO，验证过程和原来一样
			// 登录请求不能被拦截
			if (!uri.contains("w/core/login")) {
				String token = request.getHeader("TOKEN");
				// 判断是否有token
				if (null == token) {// 没有token信息
									// 1、是用户退出登录
									// 3、token失效被清除
					// 需要重新登录
					response.setStatus(403);
					return false;
				} else {// 如果有token。
						// 此时不需要验证是否有session信息，继续走校验流程。
						// 最后验证有没有session决定是否需要写入session。防止程序出现问题
					// 第一步
					// 需要走KNOX或者LDAP验证，证明用户信息没有失效
					// 以下是默认没有失效的验证
					// 第二步验证token
					// 根据token获取用户信息
					Access access = coreService.getAccess(token);
					if (null != access) {// 需要验证token时间是否过期
						// 判断token是否失效
						Date endTime = access.getEndTime();
						Date nowDate = new Date();
						if (nowDate.getTime() < endTime.getTime()) {// 当前时间小于失效时间，证明没有失效
							// 获取当前用户session
							UserInfo userInfo = (UserInfo) request.getSession().getAttribute(Constant.SESSION_ID);
							if (null == userInfo) {// 如果没有session，证明是系统session失效。需要手动写入，防止出现问题
								// 查到用户信息
								UserInfo info = coreService.getUserInfo(access.getUserAccount());
								// 写入session
								request.getSession().setAttribute(Constant.SESSION_ID, info);
							}
							// 返回正确结果
							return true;
						} else {// 当前时间大于或者等于失效时间，证明token已经失效
							// 需要重新登录
							response.setStatus(403);
							return false;
						}
					} else {// 没有查询到信息
							// 1、是登录时token信息没有写入数据库成功
							// 2、用户退出登录
							// 3、token是仿冒的
						// 需要重新登录
						response.setStatus(403);
						return false;
					}
				}
			}
			return true;
		} else {
			return false;
		}
	}
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}
}
